/*
Copyright [2012] [Maria Eugenia Malagamba]
Copyright [2012] [Leandro Pellegrino]
Copyright [2012] [Julia Gambuzzi]
Copyright [2012] [Ignacio Capodanno]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/

#include "PestaniaServidor.h"

PestaniaServidor::PestaniaServidor(SDL_Surface* ventana): Pestania(ventana)
{
	this->menu = new MenuOpciones(20, 80);
	this->salir = new Boton(20,400,"Salir","botonI");
	this->iniciar = new Boton(275,400,"Iniciar","botonI");
	this->fondo = SDL_LoadBMP("fondoCliente.bmp");
	this->puerto = new Label(20, 280,"Puerto", 26);
	this->textBoxPuerto = new TextBox( 130, 280, "8085");
	this->estadoConexion = new Label(10, 470,"Presione Iniciar para iniciar el servidor                        ", 18);
	this->partida = NULL;

}

void PestaniaServidor::mostrar(SDL_Surface* ventana){
	SDL_Rect posicion;
	posicion.x=0;
	posicion.y=40;
	SDL_BlitSurface(this->fondo,NULL,ventana,&posicion);
	this->menu->mostrar(ventana);
	this->iniciar->mostrar(ventana);
	this->salir->mostrar(ventana);
	this->puerto->mostrar(ventana);
	this->textBoxPuerto->mostrar(ventana);
	this->estadoConexion->mostrar(ventana);
}

int PestaniaServidor::actuar(SDL_Event evento){

	int x = evento.button.x;
	int y = evento.button.y;

	this->menu->actuar(x,y);

	if (evento.type == SDL_KEYDOWN && this->textBoxPuerto->getSeleccionada()){
		this->textBoxPuerto->ingreso(evento);
		this->textBoxPuerto->mostrar(this->ventana);
		SDL_Flip(this->ventana);
	}else{
		// seteo el estado del textbox
		this->textBoxPuerto->setSeleccionada(this->textBoxPuerto->fuiClickeado(x,y));

		if (this->iniciar->fuiClickeado(x,y) && this->menu->getOpcionActual() != ""){

			if( this->partida == NULL){

				this->partida = new PartidaServidor(this->menu->getOpcionActual());

				this->cambiarEstado("Esperando conexiones...                                                        ");

				if (partida->prepararPartida(this->textBoxPuerto->getValor()) == -1){

					this->cambiarEstado("No se pudo conectar al puerto. Intente nuevamente.                         ");

					delete partida;
					this->partida = NULL;
				};

			}

			return 0;
		}else if (this->salir->fuiClickeado(x,y)){
			if(this->partida != NULL){
				delete partida;
				this->partida = NULL;
			}
			return -1;
		}
	}
}

int PestaniaServidor::actuar(){

	//conectar jugadores a la partida ya se clikeo el boton inicio !!!
	if (this->partida != NULL){

		if (this->partida->getCantidadDeJugadores() < 2){ 

			//esto bloquea la pantalla
			int jugador = partida->conectarJugador();

			this->cambiarEstado("Conectando con jugador . . .                                          ");

			// levantamos un hilo para enviar el escenario
			this->partida->enviarEscenario(jugador);
		}
		if (this->partida->getCantidadDeJugadores() == this->partida->getCantidadMaximaDeJugadores()
			&& this->partida->clienteUnoCargoEscenario() && this->partida->clienteDosCargoEscenario()){

				this->cambiarEstado("Comienza el juego . . .                                               ");

				//cada cliente recibe la nave del otro

				this->partida->servidor->enviarEntero(this->partida->getNumeroNave(0),1);
				this->partida->servidor->enviarEntero(1,1);
				this->partida->servidor->enviarEntero(this->partida->getNumeroNave(1),0);
				this->partida->servidor->enviarEntero(0,0);

				//cada cliente recibe el nombre del otro
				this->partida->servidor->enviarString(this->partida->getNombreCliente(0),1);
				this->partida->servidor->enviarString(this->partida->getNombreCliente(1),0);


				//comienza el juego
				this->partida->iniciar();

				if(this->partida != NULL){
					delete this->partida;
					this->partida = NULL;
				}
				this->cambiarEstado("Presione Iniciar para iniciar el servidor                              ");
		}else{

			this->cambiarEstado("Conectando con jugador . . .                                          ");

		}
	}
	return 0;
}

void PestaniaServidor::cambiarEstado(string nuevoEstado){

	this->estadoConexion->cambiarTexto(nuevoEstado);
	SDL_FillRect( this->ventana, &this->estadoConexion->posicion, SDL_MapRGB( this->ventana->format, 0, 173,92 ) );
	this->estadoConexion->mostrar(this->ventana);
	SDL_Flip(this->ventana);
}

PestaniaServidor::~PestaniaServidor(void)
{
	delete this->menu;
	delete this->salir;
	delete this->iniciar;
	delete this->puerto;
	delete this->estadoConexion;
	if (this->partida != NULL){
		delete this->partida;
	}
	SDL_FreeSurface(this->fondo);
}
